﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Noris.Tools.FrxEditor.Components
{
    #region class DisposeActionCaller : třída, která při svém Dispose vyvolá danou metodu, a předá ji daná data (generický typ).
    /// <summary>
    /// DisposeActionCaller : třída, která při svém Dispose vyvolá danou metodu, a předá ji daná data (generický typ).
    /// </summary>
    public class DisposeActionCaller<T> : IDisposable
    {
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="action"></param>
        /// <param name="data"></param>
        public DisposeActionCaller(Action<T> action, T data)
        {
            this._Action = action;
            this._Data = data;
        }
        void IDisposable.Dispose()
        {
            if (this._Action != null)
                this._Action(this._Data);
        }
        private Action<T> _Action;
        private T _Data;
    }
    #endregion
    #region class ValueChangedEventArgs : data předávaná do handleru události typu Data byla změněna
    /// <summary>
    /// Konkrétní třída ValueChangedEventArgs pro data typu float
    /// </summary>
    public class ValueFloatChangedEventArgs : ValueChangedEventArgs<float>
    {
        /// <summary>
        /// Konkrétní třída ValueChangedEventArgs pro data typu float. Konstruktor.
        /// </summary>
        /// <param name="oldValue"></param>
        /// <param name="newValue"></param>
        /// <param name="needDraw"></param>
        public ValueFloatChangedEventArgs(float oldValue, float newValue, bool needDraw)
            : base(oldValue, newValue, needDraw)
        { }
    }
    /// <summary>
    /// ValueChangedEventArgs : data předávaná do handleru události typu Data byla změněna.
    /// </summary>
    public class ValueChangedEventArgs<T> : EventArgs
    {
        /// <summary>
        /// ValueChangedEventArgs : data předávaná do handleru události typu Data byla změněna. Konstruktor.
        /// </summary>
        /// <param name="oldValue"></param>
        /// <param name="newValue"></param>
        /// <param name="needDraw"></param>
        public ValueChangedEventArgs(T oldValue, T newValue, bool needDraw)
        {
            this.OldValue = oldValue;
            this.NewValue = newValue;
            this.NeedDraw = needDraw;
            this.Cancel = false;
        }
        /// <summary>
        /// Původní hodnota
        /// </summary>
        public T OldValue { get; private set; }
        /// <summary>
        /// Nově vkládaná hodnota
        /// </summary>
        public T NewValue { get; private set; }
        /// <summary>
        /// Na vstupu: false = zdrojový objekt si nepřeje provádět vykreslování v rámci volaného handleru (asi si vykreslení řeší sám jinak);
        /// true = součástí eventhandleru by mělo být překreslení objektu.
        /// </summary>
        public bool NeedDraw { get; set; }
        /// <summary>
        /// Aktuální změna je handlerem odmítnuta, zdrojový objekt by ji neměl realizovat.
        /// </summary>
        public bool Cancel { get; set; }
    }
    #endregion
}
